package org.proxycine.gestsalles.web.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.proxycine.gestsalles.model.entities.Cinema;
import org.proxycine.gestsalles.model.entities.Copie;
import org.proxycine.gestsalles.model.entities.Film;
import org.proxycine.gestsalles.services.CinemaService;
import org.proxycine.gestsalles.services.CopieService;
import org.proxycine.gestsalles.web.constantes.ConstantesWeb;

@ManagedBean(name="affectationCopiesBean")
@ViewScoped
public class AffectationCopiesBean  implements Serializable {

	private List<Copie> copiesDispo;
	private List<Copie> copiesSources;
	private List<Copie> copiesSelectionnes;
	private Map<Integer,List<Copie> > filmsDispo;
	private List<Cinema> cinemas;
	private Cinema cinemaChoisi;
	private boolean printErrorMsg;
	private String errorMsg;
	
	private boolean printErrorMsgCinema;
	private String errorMsgCinema;
	
	private String nbCopiesSelectionnees;
	private String nbCopiesSources;
	
	public AffectationCopiesBean() {		
	
		filmsDispo = new HashMap<Integer, List<Copie> >();
		copiesSources = new ArrayList<Copie>();
		copiesSelectionnes = new ArrayList<Copie>();
		copiesDispo = CopieService.getInstance().getCopiesDisponibles();
		cinemas = CinemaService.getInstance().getAllCinemas();
		
		calculeListeCopiesSources();
	}
	
	public void calculeListeCopiesSources(){
		if(copiesDispo != null) {
			for(Copie copie : copiesDispo) {
				boolean isInCopiesSources = false;
				for(Copie copieSource : copiesSources) {
					if(copieSource.getFilm().getId() == copie.getFilm().getId()) {
						isInCopiesSources = true;
						break;
					}
				}
				if(!isInCopiesSources) {
					copiesSources.add(copie);
				}
				
				List<Copie> copiesDuFilm = new ArrayList<Copie>();
				if(filmsDispo.containsKey(copie.getFilm().getId())) {
					copiesDuFilm = filmsDispo.get(copie.getFilm().getId());
				}
				copiesDuFilm.add(copie);
				filmsDispo.put(copie.getFilm().getId(), copiesDuFilm);
			}
		}
	}
	
	public int getNbCopiesFilm(Film film) {
		return filmsDispo.get(film.getId()).size();
	}
	
	
	public void ajouterCopie(Copie copie) {
		if(copie != null) {
			//on vérifie qu'une copie du même film n'a pas déjà été ajouté
			for(Copie copieAjoutees : copiesSelectionnes) {
				if(copie.getFilm().getId() == copieAjoutees.getFilm().getId()) {
					printErrorMsg = true;
					return;
				}
			}
			printErrorMsg = false;
			printErrorMsgCinema = false;
			copiesSelectionnes.add(copie);
			copiesDispo.remove(copie);
			copiesSources.clear();
			filmsDispo.clear();
			calculeListeCopiesSources();
		}		
	}
	
	public void retireCopieAjoutee(Copie copie) {
		if(copie != null) {
			copiesSelectionnes.remove(copie);
			copiesDispo.add(copie);
			copiesSources.clear();
			filmsDispo.clear();
			calculeListeCopiesSources();
			printErrorMsg = false;
			printErrorMsgCinema = false;
		}
	}
	
	public void validerCopies(){
		if(cinemaChoisi == null){
			printErrorMsgCinema = true;
			return;
		}
		else{
			for(Copie copie : copiesSelectionnes) {
				CopieService.getInstance().affecterCopieAUnCinema(copie, cinemaChoisi.getId());
			}
			for(Copie copie : copiesDispo) {
				CopieService.getInstance().setEtatCopieAchete(copie);
			}
		}
		
	}
	
	public List<Copie> getCopiesDispo() {
		return copiesDispo;
	}

	public void setCopiesDispo(List<Copie> copiesDispo) {
		this.copiesDispo = copiesDispo;
	}

	public List<Copie> getCopiesSources() {
		return copiesSources;
	}

	public void setCopiesSources(List<Copie> copiesSources) {
		this.copiesSources = copiesSources;
	}

	public List<Copie> getCopiesSelectionnes() {
		return copiesSelectionnes;
	}

	public void setCopiesSelectionnes(List<Copie> copiesSelectionnes) {
		this.copiesSelectionnes = copiesSelectionnes;
	}

	public Map<Integer, List<Copie>> getFilmsDispo() {
		return filmsDispo;
	}

	public void setFilmsDispo(Map<Integer, List<Copie>> filmsDispo) {
		this.filmsDispo = filmsDispo;
	}

	public List<Cinema> getCinemas() {
		if(cinemas == null) {
			cinemas = new ArrayList<Cinema>(); 
		}
		return cinemas;
	}

	public void setCinemas(List<Cinema> cinemas) {
		this.cinemas = cinemas;
	}

	public Cinema getCinemaChoisi() {
		return cinemaChoisi;
	}

	public void setCinemaChoisi(Cinema cinemaChoisi) {
		this.cinemaChoisi = cinemaChoisi;
		printErrorMsg = false;
		printErrorMsgCinema = false;
		List<Copie> copiesDistribuees = CopieService.getInstance().getCopiesDistribueesParCinema(cinemaChoisi); 
		copiesDispo = CopieService.getInstance().getCopiesDisponibles();
		if(copiesDistribuees != null) {
			copiesSelectionnes = copiesDistribuees;
		}
		copiesSources.clear();
		filmsDispo.clear();
		calculeListeCopiesSources();
	}

	public String getErrorMsg() {
		if(printErrorMsg){
			errorMsg = ConstantesWeb.ERROR_MESSAGE_AFFECTATION_COPIE;
		}
		else{
			errorMsg = "";
		}
		return errorMsg;
	}

	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}

	public boolean isPrintErrorMsg() {
		return printErrorMsg;
	}

	public void setPrintErrorMsg(boolean printErrorMsg) {
		this.printErrorMsg = printErrorMsg;
	}

	public String getNbCopiesSelectionnees() {
		nbCopiesSelectionnees = "" + copiesSelectionnes.size();
		return nbCopiesSelectionnees;
	}

	public void setNbCopiesSelectionnees(String nbCopiesSelectionnees) {
		this.nbCopiesSelectionnees = nbCopiesSelectionnees;
	}

	public String getNbCopiesSources() {
		nbCopiesSources = "" + copiesSources.size();
		return nbCopiesSources;
	}

	public void setNbCopiesSources(String nbCopiesSources) {
		this.nbCopiesSources = nbCopiesSources;
	}

	public String getErrorMsgCinema() {
		if(printErrorMsgCinema) {
			errorMsgCinema = ConstantesWeb.ERROR_MESSAGE_AFFECTATION_COPIE_CHOIX_CINEMA;
		}
		else {
			errorMsgCinema = "";
		}
		return errorMsgCinema;
	}

	public void setErrorMsgCinema(String errorMsgCinema) {
		this.errorMsgCinema = errorMsgCinema;
	}

	public boolean isPrintErrorMsgCinema() {
		return printErrorMsgCinema;
	}

	public void setPrintErrorMsgCinema(boolean printErrorMsgCinema) {
		this.printErrorMsgCinema = printErrorMsgCinema;
	}


	
}
